package com.sky.interceptor;

import com.sky.constant.JwtClaimsConstant;
import com.sky.context.BaseContext;
import com.sky.properties.JwtProperties;
import com.sky.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * jwt令牌校验的拦截器
 *
 * @author jianKangS1
 * @date 2023/12/20
 */
@Component
@Slf4j
public class JwtTokenGUserInterceptor implements HandlerInterceptor {

  @Autowired
  private JwtProperties jwtProperties;

  /**
   * 校验jwt
   *
   * @param request
   * @param response
   * @param handler
   * @return
   * @throws Exception
   */
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {

    //判断当前拦截到的是Controller的方法还是其他资源
    if (!(handler instanceof HandlerMethod)) {
      //当前拦截到的不是动态方法，直接放行
      return true;
    }

    //1、从请求头中获取令牌
    String token = request.getHeader(jwtProperties.getGuserTokenName());

    //2、校验令牌
    try {
      log.info("jwt校验:{}", token);
      Claims claims = JwtUtil.parseJWT(jwtProperties.getGuserSecretKey(), token);
      int gUserId = Integer.valueOf(claims.get(JwtClaimsConstant.GUer_ID).toString());
      log.info("当前用户id:{}", gUserId);
      BaseContext.setCurrentId(gUserId);
      //3、通过，放行
      return true;
    } catch (Exception ex) {
      //4、不通过，响应401状态码
      response.setStatus(401);
      return false;
    }
  }
}
